package com.baor.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baor.dao.BalanceReconciliationDao;
import com.baor.dao.CustomerDao;
import com.baor.domain.BalanceReconciliationVO;
import com.baor.service.BalanceReconciliationService;
import com.baor.util.R;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;


@Service
public class BalanceReconciliationServiceImpl implements BalanceReconciliationService {

    @Autowired
    private BalanceReconciliationDao reconciliationDao;

    @Autowired
    private CustomerDao customerDao; // 设备持有者信息DAO

    /**
     * 生成对账记录
     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public R generateReconciliation(Map<String, Object> params) {
//        // 1. 参数校验
//        if (params.get("checkDate") == null) {
//            return R.er("对账日期不能为空");
//        }
//        Date checkDate = (Date) params.get("checkDate");
//        Integer checkUserId = (Integer) params.get("checkUserId");
//        if (checkUserId == null) {
//            return R.er("对账人ID不能为空");
//        }
//        // 2. 查询所有设备持有者
//        List<CustomerVO> holders = customerDao.selectList(
//                new LambdaQueryWrapper<CustomerVO>().eq(CustomerVO::getIsHolder, 1)
//        );
//        int successCount = 0;
//        for (CustomerVO holder : holders) {
//            // 3. 计算系统记录余额（实际业务中需根据交易记录汇总）
//            BigDecimal systemBalance = BigDecimal.valueOf(holder.getBalance());
//            // 4. 假设实际余额从第三方接口获取（此处模拟）
//            BigDecimal actualBalance = calculateActualBalance(holder.getId());
//            // 5. 计算差异金额
//            BigDecimal difference = systemBalance.subtract(actualBalance).abs();
//            // 6. 创建对账记录
//            BalanceReconciliationVO record = new BalanceReconciliationVO();
//            record.setHolderId(holder.getId());
//            record.setCheckDate(checkDate);
//            record.setSystemBalance(systemBalance);
//            record.setActualBalance(actualBalance);
//            record.setDifference(difference);
//            record.setStatus(difference.compareTo(BigDecimal.ZERO) == 0 ? 1 : 2); // 1-正常 2-异常
//            record.setCheckUserId(checkUserId);
//            record.setCreatedAt(new Date());
//            record.setUpdatedAt(new Date());
//            record.setIsDeleted(0);
//            reconciliationDao.insert(record);
//            successCount++;
//        }
//
//        return R.ok("对账记录生成成功，共处理" + successCount + "条");
//    }

    /**
     * 查询对账记录列表
     */
    @Override
    public R getReconciliationList(Map<String, Object> params) {
        int pageIndex = params.get("pageIndex") != null ?
                Integer.parseInt(params.get("pageIndex").toString()) : 1;
        int pageSize = params.get("pageSize") != null ?
                Integer.parseInt(params.get("pageSize").toString()) : 10;
        Page<Map<String, Object>> page = new Page<>(pageIndex, pageSize);
        MPJLambdaWrapper<BalanceReconciliationVO> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(BalanceReconciliationVO.class)
//                .select(CustomerVO::getRealname, CustomerVO::getPhone)
//                .leftJoin(CustomerVO.class, CustomerVO::getId, BalanceReconciliationVO::getHolderId)
                .orderByDesc(BalanceReconciliationVO::getCheckDate);
//        // 状态筛选
//        if (params.get("status") != null) {
//            wrapper.eq(BalanceReconciliationVO::getStatus, params.get("status"));
//        }
//        // 时间范围筛选
//        if (params.get("startDate") != null) {
//            wrapper.ge(BalanceReconciliationVO::getCheckDate, params.get("startDate"));
//        }
//        if (params.get("endDate") != null) {
//            wrapper.le(BalanceReconciliationVO::getCheckDate, params.get("endDate"));
//        }
//        // 持有者姓名/手机号筛选
//        if (params.get("keyword") != null) {
//            String keyword = params.get("keyword").toString().trim();
//            wrapper.nested(wq -> wq
//                    .like(CustomerVO::getRealname, keyword)
//                    .or()
//                    .like(CustomerVO::getPhone, keyword)
//            );
//        }
        IPage<Map<String, Object>> resultPage = reconciliationDao.selectJoinMapsPage(page, wrapper);
        Map<String, Object> result = new HashMap<>();
        result.put("list", resultPage.getRecords());
        result.put("totalSize", resultPage.getTotal());
        result.put("pageIndex", pageIndex);
        result.put("pageSize", pageSize);
        return R.ok(result);
    }

    /**
     * 处理异常对账记录（手动调整）
     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public R handleAbnormalRecord(Map<String, Object> params) {
//        if (params.get("id") == null) {
//            return R.er("对账记录ID不能为空");
//        }
//        Integer id = Integer.parseInt(params.get("id").toString());
//        BigDecimal adjustAmount = new BigDecimal(params.get("adjustAmount").toString());
//
//        // 更新对账记录状态
//        BalanceReconciliationVO record = reconciliationDao.selectById(id);
//        if (record == null) {
//            return R.er("对账记录不存在");
//        }
//        record.setStatus(1); // 标记为已处理
//        record.setUpdatedAt(new Date());
//        reconciliationDao.updateById(record);
//
//        // 调整设备持有者余额
//        CustomerVO holder = customerDao.selectById(record.getHolderId());
//        holder.setBalance(holder.getBalance());
//        customerDao.updateById(holder);
//
//        return R.ok("异常对账记录处理成功");
//    }

    /**
     * 模拟获取实际余额（实际业务中可能对接第三方支付接口）
     */
//    private BigDecimal calculateActualBalance(Integer holderId) {
//        // 此处仅为示例，实际需根据业务实现
//        return new BigDecimal(new Random().nextInt(10000));
//    }
}
